/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package SintaticoPacote;

import SintaticoPacote.TratamentoErro.ErroTabela;
import SintaticoPacote.TratamentoErro.TabelaErros;
import compilador_full.TabelaSimbolos;

/**
 *
 * @author Loreno
 */
public class saidaNaTela {

    acessoStruct as = new acessoStruct();

    //metodo para reconhecer o printf
    public boolean saidaTela(TabelaSimbolos tabelasimbolos) {

        if(tabelasimbolos.getLookahead().equals("printf"))
            tabelasimbolos.insertEscopo();
        if (tabelasimbolos.reconhecer("printf")) {
            if (tabelasimbolos.reconhecer("(")) {
                if (tabelasimbolos.getTipo().equals("identificador")) { //codição necessária para ser nome ou ponteiro

                    //ponteiro
                    if (tabelasimbolos.superLookahead(1).equals("-")) {
                        if (as.acessoStruct(tabelasimbolos)) {
                            if (tabelasimbolos.reconhecer(")")) {
                                if (tabelasimbolos.reconhecer(";")) {
                                    return true;
                                } else {

                                    ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha());
                                    TabelaErros.getInstance().getTabelaErros().add(erro);
                                    return false;
                                }

                                //loop do fecho
                            } else if (tabelasimbolos.getLookahead().equals(",")) {
                                while (tabelasimbolos.getLookahead().equals(",")) {
                                    tabelasimbolos.reconhecer(",");
                                    if (tabelasimbolos.getTipo().equals("identificador")) {
                                        if (tabelasimbolos.superLookahead(1).equals("-")) {
                                            if (as.acessoStruct(tabelasimbolos)); else {
                                                return false;
                                            }
                                        } else if (tabelasimbolos.reconhecer(tabelasimbolos.getLookahead())); else {

                                            ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha());
                                            TabelaErros.getInstance().getTabelaErros().add(erro);
                                            return false;
                                        }
                                    } else if (tabelasimbolos.getTipo().equals("frase")) {
                                        if (tabelasimbolos.reconhecer(tabelasimbolos.getLookahead())); else {

                                            ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha());
                                            TabelaErros.getInstance().getTabelaErros().add(erro);
                                            return false;
                                        }
                                    } else {
                                        return false;
                                    }
                                }
                                if (tabelasimbolos.reconhecer(")")) {
                                    if (tabelasimbolos.reconhecer(";")) {
                                        return true;
                                    } else {

                                        ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha());
                                        TabelaErros.getInstance().getTabelaErros().add(erro);
                                        return false;
                                    }
                                } else {

                                    ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha());
                                    TabelaErros.getInstance().getTabelaErros().add(erro);
                                    return false;
                                }
                            } else {
                                return false;
                            }
                        } else {
                            return false;
                        }

                        //nome
                    } else if (tabelasimbolos.reconhecer(tabelasimbolos.getLookahead())) {
                        if (tabelasimbolos.reconhecer(")")) {
                            if (tabelasimbolos.reconhecer(";")) {
                                return true;
                            } else {

                                ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha());
                                TabelaErros.getInstance().getTabelaErros().add(erro);
                                return false;
                            }

                            //loop do fecho
                        } else if (tabelasimbolos.getLookahead().equals(",")) {
                            while (tabelasimbolos.getLookahead().equals(",")) {
                                tabelasimbolos.reconhecer(",");
                                if (tabelasimbolos.getTipo().equals("identificador")) {
                                    if (tabelasimbolos.superLookahead(1).equals("-")) {
                                        if (/*as.acessoStruct()*/true); else {
                                            return false;
                                        }
                                    } else if (tabelasimbolos.reconhecer(tabelasimbolos.getLookahead())); else {

                                        ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha());
                                        TabelaErros.getInstance().getTabelaErros().add(erro);
                                        return false;
                                    }
                                } else if (tabelasimbolos.getTipo().equals("frase")) {
                                    if (tabelasimbolos.reconhecer(tabelasimbolos.getLookahead())); else {

                                        ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha());
                                        TabelaErros.getInstance().getTabelaErros().add(erro);
                                        return false;
                                    }
                                } else {
                                    return false;
                                }
                            }
                            if (tabelasimbolos.reconhecer(")")) {
                                if (tabelasimbolos.reconhecer(";")) {
                                    return true;
                                } else {

                                    ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha());
                                    TabelaErros.getInstance().getTabelaErros().add(erro);
                                    return false;
                                }
                            } else {

                                ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha());
                                TabelaErros.getInstance().getTabelaErros().add(erro);
                                return false;
                            }


                        } else {
                            return false;
                        }
                    } else {
                        return false;
                    }

                    //frase - string
                } else if (tabelasimbolos.getTipo().equals("frase")) {
                    if (tabelasimbolos.reconhecer(tabelasimbolos.getLookahead())) {
                        if (tabelasimbolos.reconhecer(")")) {
                            if (tabelasimbolos.reconhecer(";")) {
                                return true;
                            } else {

                                ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha());
                                TabelaErros.getInstance().getTabelaErros().add(erro);
                                return false;
                            }

                            //loop do fecho
                        } else if (tabelasimbolos.getLookahead().equals(",")) {
                            while (tabelasimbolos.getLookahead().equals(",")) {
                                tabelasimbolos.reconhecer(",");
                                if (tabelasimbolos.getTipo().equals("identificador")) {
                                    if (tabelasimbolos.superLookahead(1).equals("-")) {
                                        if (/*as.acessoStruct()*/true); else {
                                            return false;
                                        }
                                    } else if (tabelasimbolos.reconhecer(tabelasimbolos.getLookahead())); else {

                                        ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha());
                                        TabelaErros.getInstance().getTabelaErros().add(erro);
                                        return false;
                                    }
                                } else if (tabelasimbolos.getTipo().equals("frase")) {
                                    if (tabelasimbolos.reconhecer(tabelasimbolos.getLookahead())); else {

                                        ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha());
                                        TabelaErros.getInstance().getTabelaErros().add(erro);
                                        return false;
                                    }
                                } else {
                                    return false;
                                }
                            }
                            if (tabelasimbolos.reconhecer(")")) {
                                if (tabelasimbolos.reconhecer(";")) {
                                    return true;
                                } else {

                                    ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha());
                                    TabelaErros.getInstance().getTabelaErros().add(erro);
                                    return false;
                                }
                            } else {

                                ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha());
                                TabelaErros.getInstance().getTabelaErros().add(erro);
                                return false;
                            }

                        } else {
                            return false;
                        }
                    } else {

                        ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha());
                        TabelaErros.getInstance().getTabelaErros().add(erro);
                        return false;
                    }
                } else {
                    return false;
                }
            } else {

                ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha());
                TabelaErros.getInstance().getTabelaErros().add(erro);
                return false;
            }
        } else {

            ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha());
            TabelaErros.getInstance().getTabelaErros().add(erro);
            return false;
        }
    }
}
